import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.net.ServerSocketFactory;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;

/**
 * Rappresenta il server per la gestione del dizionario ITALIANO-INGLESE
 */
public class DictionaryServer extends Thread {
	private static final int PORT = 44444; // Porta del server
	private ServerSocket servSocket;
	private ItEnDictionary dictionary;

	public static void main(String args[]) {
		new DictionaryServer().start();
	}

	public DictionaryServer() {
		// Imposto le property per la gestione dei certificati
		System.setProperty("javax.net.ssl.keyStore", "serverkeystore.jks");
		System.setProperty("javax.net.ssl.keyStorePassword", "frafele");
		System.setProperty("javax.net.ssl.trustStore", "servertruststore.jks");
		System.setProperty("javax.net.ssl.trustStorePassword", "frafele");

		try {
			servSocket = createServerSocket(PORT);

			dictionary = new ItEnDictionary();
		} catch (IOException e) {
			System.out
					.println("Impossibile avviare il server. Probabilemente la porta è occupata o il server è già attivo.");
		}
	}

	/**
	 * Consente di creare una socket SSL per il server
	 * 
	 * @param port
	 *            Porta su cui avviare il server
	 * @return La socket creata
	 * @throws IOException
	 */
	private ServerSocket createServerSocket(int port) throws IOException {
		ServerSocketFactory factory = SSLServerSocketFactory.getDefault();
		SSLServerSocket sock = (SSLServerSocket) factory
				.createServerSocket(port);
		sock.setNeedClientAuth(true);
		return sock;
	}

	/**
	 * Thread per la gestione del server
	 */
	@Override
	public void run() {

		if (servSocket != null) {
			while (true) {

				try {
					Socket sock;
					sock = servSocket.accept();

					// Creo un nuovo gestore della connessione
					DictionaryConnectionHandler handler = new DictionaryConnectionHandler(
							sock, dictionary);
					Thread t = new Thread(handler);
					t.start();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		}
	}
}
